package com.yootk.listener;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionAttributeListener;
import jakarta.servlet.http.HttpSessionBindingEvent;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;

import java.util.HashMap;
import java.util.Map;

@WebListener
public class OnlineListener implements  // 在线用户监听类
        ServletContextListener,             // ServletContext状态监听
        HttpSessionListener,                // Session状态监听
        HttpSessionAttributeListener {      // Session属性监听
    private ServletContext application; // Servlet上下文

    @Override
    public void contextInitialized(ServletContextEvent sce) { // 上下文初始化
        this.application = sce.getServletContext(); // 获取Servlet上下文对象
        this.application.setAttribute("online", new HashMap<String, Boolean>()); // 空列表
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {    // 属性增加
        if ("userid".equals(se.getName())) {    // 当前操作属性为userid
            Map<String, Boolean> map = (Map<String, Boolean>) this.application.getAttribute("online");
            // Map集合的key表示登录用户名，Map集合的Value表示剔除状态（true表示该用户被剔除）
            map.put((String) se.getValue(), false); // 保存用户信息
            this.application.setAttribute("online", map); // 属性更新
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) { // 注销删除用户名
        Map<String, Boolean> map = (Map<String, Boolean>) this.application.getAttribute("online");
        map.remove(se.getSession().getAttribute("userid")); // 删除信息
        this.application.setAttribute("online", map); // 属性更新
    }
}
